--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / android / app / src / main / python / meshchat_wrapper.py
Displaying Raw • Download
android/app/src/main/python/meshchat_wrapper.py 4389b643d9e4e528a9c0b3a63d3c26c07dcbd192 (4389b643) Text, 4.87 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787os
Tff7b72import T7ee787signal
Tff7b72import T7ee787sys
Tff7b72import T7ee787threading
T8b949e# Prevents a second meshchat main() if Java starts two threads (e.g. activity edge cases).
Te6edf3_server_loop_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Te6edf3_server_loop_active Tff7b72= Tff7b72False
Tff7b72def Td2a8ff_ensure_android_reticulum_configTb4b4b4(Te6edf3reticulum_config_dirTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3reticulum_config_dirTb4b4b4:
Tff7b72return
Te6edf3config_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3reticulum_config_dirTb4b4b4, Ta5d6ff"Ta5d6ffconfigTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3config_pathTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3existing_fileTb4b4b4:
Te6edf3content Tff7b72= Te6edf3existing_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffshare_instance = YesTa5d6ff" Tff7b72in Te6edf3contentTb4b4b4:
Te6edf3content Tff7b72= Te6edf3contentTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ffshare_instance = YesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffshare_instance = NoTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3config_pathTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3config_fileTb4b4b4:
Te6edf3config_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3contentTb4b4b4)
Tff7b72return
Tff7b72with Tffa657openTb4b4b4(Te6edf3config_pathTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3config_fileTb4b4b4:
Te6edf3config_fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff[reticulum]Tffea00\nTa5d6ff share_instance = NoTffea00\nTffea00\nTa5d6ff[interfaces]Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ff_patch_asyncio_signal_handlers_for_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787asyncio Tff7b72import Te6edf3unix_events
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3loop_cls Tff7b72= Tffa657getattrTb4b4b4(Te6edf3unix_eventsTb4b4b4, Ta5d6ff"Ta5d6ff_UnixSelectorEventLoopTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3loop_cls Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3original_add_signal_handler Tff7b72= Te6edf3loop_clsTff7b72.Td2a8ffadd_signal_handler
Tff7b72def Td2a8ff_safe_add_signal_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sigTb4b4b4, Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3original_add_signal_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sigTb4b4b4, Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149RuntimeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4) Tff7b72as Te6edf3excTb4b4b4:
Te6edf3message Tff7b72= Tffa657strTb4b4b4(Te6edf3excTb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffset_wakeup_fd only works in main threadTa5d6ff" Tff7b72in Te6edf3messageTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffmain thread of the main interpreterTa5d6ff" Tff7b72in Te6edf3messageTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72raise
Te6edf3loop_clsTff7b72.Td2a8ffadd_signal_handler Tff7b72= Te6edf3_safe_add_signal_handler
Tff7b72return Te6edf3loop_clsTb4b4b4, Te6edf3original_add_signal_handler
Tff7b72def Td2a8ff_patch_aiohttp_run_app_for_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787aiohttp Tff7b72import Te6edf3web
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3original_run_app Tff7b72= Te6edf3webTff7b72.Td2a8ffrun_app
Tff7b72def Td2a8ff_safe_run_appTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Te6edf3kwargsTff7b72.Td2a8ffsetdefaultTb4b4b4(Ta5d6ff"Ta5d6ffhandle_signalsTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72return Te6edf3original_run_appTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Te6edf3webTff7b72.Td2a8ffrun_app Tff7b72= Te6edf3_safe_run_app
Tff7b72return Te6edf3webTb4b4b4, Te6edf3original_run_app
Tff7b72def Td2a8ffstart_serverTb4b4b4(Te6edf3portTff7b72=T79c0ff8000Tb4b4b4, Te6edf3app_files_dirTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3_server_loop_active
Tff7b72with Te6edf3_server_loop_lockTb4b4b4:
Tff7b72if Te6edf3_server_loop_activeTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffmeshchat_wrapper: start_server ignored (server loop already active)Ta5d6ff"Tb4b4b4)
Tff7b72return
Te6edf3_server_loop_active Tff7b72= Tff7b72True
Tff7b72tryTb4b4b4:
Te6edf3storage_dir Tff7b72= Tff7b72None
Te6edf3reticulum_config_dir Tff7b72= Tff7b72None
Tff7b72if Te6edf3app_files_dirTb4b4b4:
Te6edf3base_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3app_files_dirTb4b4b4, Ta5d6ff"Ta5d6ffmeshchatxTa5d6ff"Tb4b4b4)
Te6edf3storage_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3base_dirTb4b4b4, Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)
Te6edf3reticulum_config_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3base_dirTb4b4b4, Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3storage_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3reticulum_config_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3_ensure_android_reticulum_configTb4b4b4(Te6edf3reticulum_config_dirTb4b4b4)
Te6edf3original_signal Tff7b72= Te6edf3signalTff7b72.Td2a8ffsignal
Tff7b72def Td2a8ff_safe_signalTb4b4b4(Te6edf3sigTb4b4b4, Te6edf3handlerTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3original_signalTb4b4b4(Te6edf3sigTb4b4b4, Te6edf3handlerTb4b4b4)
Tff7b72except Tf85149ValueError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffmain thread of the main interpreterTa5d6ff" Tff7b72in Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72raise
Te6edf3signalTff7b72.Td2a8ffsignal Tff7b72= Te6edf3_safe_signal
Te6edf3asyncio_signal_patch Tff7b72= Te6edf3_patch_asyncio_signal_handlers_for_androidTb4b4b4(Tb4b4b4)
Te6edf3aiohttp_run_app_patch Tff7b72= Te6edf3_patch_aiohttp_run_app_for_androidTb4b4b4(Tb4b4b4)
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChatTb4b4b4, Te6edf3main
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787android_push_bridge Tff7b72import Te6edf3install_websocket_hook
Te6edf3install_websocket_hookTb4b4b4(Te6edf3ReticulumMeshChatTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3hook_excTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffmeshchat_wrapper: install_websocket_hook skipped: Tffd700{Te6edf3hook_excTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffargv Tff7b72= Tb4b4b4[
Ta5d6ff"Ta5d6ffmeshchatTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--headlessTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--hostTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--portTa5d6ff"Tb4b4b4,
Tffa657strTb4b4b4(Te6edf3portTb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72if Te6edf3storage_dirTb4b4b4:
Te6edf3sysTff7b72.Td2a8ffargvTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff--storage-dirTa5d6ff"Tb4b4b4, Te6edf3storage_dirTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3reticulum_config_dirTb4b4b4:
Te6edf3sysTff7b72.Td2a8ffargvTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff--reticulum-config-dirTa5d6ff"Tb4b4b4, Te6edf3reticulum_config_dirTb4b4b4]Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3signalTff7b72.Td2a8ffsignal Tff7b72= Te6edf3original_signal
Tff7b72if Te6edf3asyncio_signal_patch Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3loop_clsTb4b4b4, Te6edf3original_add_signal_handler Tff7b72= Te6edf3asyncio_signal_patch
Te6edf3loop_clsTff7b72.Td2a8ffadd_signal_handler Tff7b72= Te6edf3original_add_signal_handler
Tff7b72if Te6edf3aiohttp_run_app_patch Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3web_moduleTb4b4b4, Te6edf3original_run_app Tff7b72= Te6edf3aiohttp_run_app_patch
Te6edf3web_moduleTff7b72.Td2a8ffrun_app Tff7b72= Te6edf3original_run_app
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError starting MeshChatX server: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72import T7ee787traceback
Te6edf3tracebackTff7b72.Td2a8ffprint_excTb4b4b4(Tb4b4b4)
Tff7b72raise
Tff7b72finallyTb4b4b4:
Tff7b72with Te6edf3_server_loop_lockTb4b4b4:
Te6edf3_server_loop_active Tff7b72= Tff7b72False
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────